package ace.module.common.core.impl.manager;

import ace.cmp.data.spring.data.jdbc.querydsl.rsql.core.manager.DtoManager;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * 租户相关实体接口.
 *
 * @author Caspar
 */
public interface EntityOfAppManager<EntityT, IdT, EntityDtoT> extends DtoManager<EntityT, IdT, EntityDtoT> {


  /**
   * 设置实体应用id.
   *
   * @param entity  实体
   * @param appId 应用id
   */
  void setEntityAppId(EntityT entity, Serializable appId);

  /**
   * 獲取實體應用id.
   * @param entity 实体
   */
  Serializable getEntityAppId(EntityT entity);

  /**
   * 删除实体,根据租户id与实体ids
   *
   * @param appId 应用id
   * @param ids  实体ids
   * @return true or false
   */
  boolean removeByAppIdAndIdIn(Serializable appId, List<IdT> ids);

  /**
   * 逻辑删除实体,根据应用id与实体ids
   *
   * @param appId 应用id
   * @param ids  实体ids
   * @return true or false
   */
  boolean removeLogicByAppIdIdAndIdIn(Serializable appId, List<IdT> ids);

  /**
   * 查询一条实体记录,根据应用id与实体id.
   *
   * @param appId 应用id
   * @param id       实体id
   * @return 实体记录 或 null
   */
  EntityT getByAppIdAndId(Serializable appId, IdT id);

  /**
   * 查询实体记录,根据应用id与实体id.
   *
   * @param appId 应用id
   * @param ids      实体id
   * @return 实体记录
   */
  List<EntityT> getByAppIdAndIds(Serializable appId, List<IdT> ids);

  /**
   * 查询实体记录,根据应用id与实体id.
   *
   * @param appId 应用id
   * @param ids   实体id
   * @return 实体记录map  key=id value=实体
   */
  Map<IdT, EntityT> getMapByAppIdAndIds(Serializable appId, List<IdT> ids);

  /**
   * 分页查询实本,根据应用id与rsql查询语法.
   *
   * @param appId    应用id
   * @param rsql     rsql查询语法
   * @param pageable 分页
   * @return 分页实现
   */
  Page<EntityT> searchByAppIdAndRsql(Serializable appId, String rsql, Pageable pageable);
}
